from typing import Dict, Callable, List, Any
from dataclasses import dataclass


@dataclass
class ToolMeta:
    """工具元信息类：标准化工具定义"""
    tool_id: str          # 工具唯一标识
    name: str             # 工具名称
    description: str      # 功能描述（供智能体判断是否调用）
    parameters: List[Dict]# 入参定义（格式：[{"name": "参数名", "type": "类型", "required": True, "desc": "描述"}]）
    return_type: str      # 出参类型
    func: Callable        # 绑定的本地函数
    interface_type: str = "local"  # 接口类型（默认本地函数）


class ToolRegistry:
    """工具注册中心：管理所有可调用工具"""
    def __init__(self):
        self._tools: Dict[str, ToolMeta] = {}  # tool_id -> ToolMeta

    def register(self, tool_meta: ToolMeta) -> None:
        """注册工具"""
        if tool_meta.tool_id in self._tools:
            raise ValueError(f"工具ID已存在: {tool_meta.tool_id}")
        self._tools[tool_meta.tool_id] = tool_meta
        print(f"✅ 注册工具: {tool_meta.name} (ID: {tool_meta.tool_id})")

    def get_tool(self, tool_id: str) -> ToolMeta:
        """根据ID获取工具元信息"""
        tool = self._tools.get(tool_id)
        if not tool:
            raise KeyError(f"未找到工具: {tool_id}")
        return tool

    def list_all(self) -> List[ToolMeta]:
        """返回所有工具元信息"""
        return list(self._tools.values())

    def get_tool_info_for_agent(self) -> List[Dict]:
        """返回供智能体决策的简化工具信息"""
        return [
            {
                "tool_id": tool.tool_id,
                "name": tool.name,
                "description": tool.description,
                "parameters": tool.parameters
            }
            for tool in self.list_all()
        ]


# 全局工具注册实例
tool_registry = ToolRegistry()


def register_tool(
    tool_id: str,
    name: str,
    description: str,
    parameters: List[Dict],
    return_type: str = "string"
) -> Callable:
    """装饰器：快速将函数注册为工具"""
    def decorator(func: Callable) -> Callable:
        tool_meta = ToolMeta(
            tool_id=tool_id,
            name=name,
            description=description,
            parameters=parameters,
            return_type=return_type,
            func=func
        )
        tool_registry.register(tool_meta)
        return func
    return decorator